﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Reflection;//assembly
using System.Windows.Forms;
using System.IO;
//using MenuPrincipal;
using System.Configuration;
using Public.Administrativo;
using Public.Utils;
using Public.Empresa;
using ComponentesMio;

namespace MenuPrincipal
{
    public partial class frmLogin : Form
    {
        clsImagem _clsImagem;
        ClsUsuario _clsUsuario;
        clsEmpresa _clsEmpresa;
        ClsAtualizacao _Atual;
        ClsAtualizacao _AtualWeb;
        clsCriptografia.Criptografia cript;

        public DataTable _dtAcessaBanco = new DataTable();
        string ConnectionString, ProviderName, TipoBanco, WebConnectionString, WebProviderName, TipoBancoWeb;
        frmMenu form = new frmMenu();
        DataGridView dtg;
        
        public frmLogin()
        {
            InitializeComponent();
            _clsImagem = new clsImagem();
        }
        
        #region FUNÇÕES


        /// <summary>
        /// Função utilizada para pedir uma nova chave para o cliente
        /// </summary>
        private void PedeNovaChave()
        {
            try
            {
                MessageBox.Show(      "   Chave de acesso expirada."
                                + "\n\nEntre em contato com a TechSoul\n"
                                +      "   Fone: (018) 3269 - 6300") ;

                string ChaveAtual = string.Empty;
                InputBoxMio.InputBox("Chave de acesso VisualCommerce 10.0", "Insira a chave de acesso: ", ref ChaveAtual);
                if (string.IsNullOrEmpty(ChaveAtual) || ChaveAtual.ToString().Length < 44)
                {
                    MessageBox.Show("Chave de acesso inválida! \nO sistema será finalizado!", "Atenção");
                    Close();
                    return;
                }
                else
                {
                    string Chave = cript.Decrypt(ChaveAtual);

                    if (string.IsNullOrEmpty(Chave))
                        PedeNovaChave();
                    else
                    {
                        if (Convert.ToInt16(Chave.Substring(14, 3)) < 1
                            || Chave.Substring(0, 14).ToString() != _clsEmpresa.RetornaEmpresas().Rows[0]["EM_CGC"].ToString().Replace(".", "").Replace("/", "").Replace("-", "")
                            || !Chave.Substring(17, 8).ToString().Equals(DateTime.Now.ToString("ddMMyyyy"))
                            )
                            PedeNovaChave();
                        else
                        {
                            _Atual.AlteraChave(cript.Encrypt(ChaveAtual), cript.Encrypt(ChaveAtual.Substring(14, 3)), 1);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                PedeNovaChave();
            }
        }
        
        /// <summary>
        /// Função utilizada para verificar a chave do cliente
        /// </summary>
        private void VerificaChave()
        {
            try
            {
                cript = new clsCriptografia.Criptografia();               

                DataTable dtChaveAtual = _Atual.VerificaChaveAtual(1);
                DataTable dtChaveNova = new DataTable();
                string ChaveAtual = string.Empty
                     , ChaveNova = string.Empty;

                //Verifica se a data da chave atual é menor que a data atual
                if((dtChaveAtual.Rows.Count > 0? Convert.ToDateTime(Convert.ToDateTime(dtChaveAtual.Rows[0]["EmpBl_DataUltVerificacao"]).ToString("dd/MM/yyyy"))
                        : Convert.ToDateTime(DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy")))
                        < Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")))
                {
                    try
                    {
                        dtChaveNova = _clsEmpresa.RetornaEmpresas();
                        dtChaveNova = _AtualWeb.PesquisaChaveCliente(dtChaveNova.Rows[0]["EM_CGC"].ToString());
                        if (dtChaveNova.Rows.Count > 0)
                            ChaveNova = cript.Decrypt(dtChaveNova.Rows[0]["CliBl_ChaveAcesso"].ToString());
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Falha ao se conectar no servidor");
                    }

                    if (dtChaveAtual.Rows.Count > 0)
                    {
                        ChaveAtual = cript.Decrypt(dtChaveAtual.Rows[0]["EmpBl_ChaveAcesso"].ToString());
                        if (!string.IsNullOrEmpty(ChaveNova))
                        {
                            if (ChaveNova != ChaveAtual)
                            {
                                ChaveAtual = ChaveNova;
                                _Atual.AlteraChave(cript.Encrypt(ChaveAtual), cript.Encrypt(ChaveAtual.Substring(14, 3)), 1);
                            }
                        }
                    }
                    else
                        ChaveAtual = ChaveNova;
                    if (Convert.ToInt16(ChaveAtual.Substring(14, 3)) < 1)
                        PedeNovaChave();
                    else
                    {
                        _Atual.AlteraChave(cript.Encrypt(ChaveAtual)
                            , cript.Encrypt((Convert.ToInt16(ChaveAtual.Substring(14, 3)) - 1).ToString()), 1);
                    }
                }
            }
            catch (Exception ex)
            {
                //PedeNovaChave();
                MessageBox.Show("Ocorreu um erro ao validar a Licença do VisualCommerce 10.0!\n Contate o administrador do sistema!");
                this.Close();
            }
        }


        /// <summary>
        /// Chama o frmMenu carregando o Menu de acordo com o usuario
        /// logado e fechar o frmLogin
        /// </summary>
        private void ChamaForm()
        {
            try
            {
                Screen Srn = Screen.PrimaryScreen;
                this.Hide();

                form.Us_Login = txtLogin.Text;
                form.Us_Senha = txtSenha.Text;
                DataTable _dt = _clsEmpresa.RetornaEmpresas();
                form.EmpFantasia = _dt.Rows[0]["em_fantas"].ToString();
                form.CGCEmpresa = _dt.Rows[0]["EM_CGC"].ToString();
                form.CodEmpresa = cmbEmpresa.SelectedValue.ToString();
                form.NomeEmpresa = cmbEmpresa.Text;
                form.ConnectionString = ConnectionString;
                form.ProviderName = ProviderName;
                form.TipoBanco = TipoBanco;
                form.Width = Srn.Bounds.Width;
                form.Height = Srn.Bounds.Height;
                form.ShowDialog();
                this.Close();
                this.Dispose();
                Application.Exit();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao Realizar a Operação! Erro:" + ex.ToString());
            }
        }

        public void CarregaComboEmpresa()
        {
            ///Foi reconfigurado pois estes campos não existem na tabela empresa
            //this.cmbEmpresa.DataSource = new ClsEmpresa().RetornaEmpresaNomeFam();
            //this.cmbEmpresa.DisplayMember = "Emp_NomeFantasia";
            //this.cmbEmpresa.ValueMember = "Emp_Codigo";
            //DataTable _dt = _clsEmpresa.RetornaEmpresas();
            if (this.txtLogin.Text.ToLower().Trim() == "systemadmafk2020")
                this.cmbEmpresa.DataSource = _clsEmpresa.RetornaEmpresas();
            else
                this.cmbEmpresa.DataSource = _clsUsuario.RetornaEmpresaUsuario(txtLogin.Text, 1, 0);
            this.cmbEmpresa.DisplayMember = "em_razsoc";
            this.cmbEmpresa.ValueMember = "em_codigo";
        }
   
        #endregion
        
        #region VALIDAÇÔES

        private void ValidaUsuarioEmpresa()
        {
            if (string.IsNullOrEmpty(cmbEmpresa.Text))
            {
                MessageBox.Show("O usuário informado não possui empresa cadastrada,\nentrar em contao com o administrador do sistema", "Atenção");
                txtLogin.Focus();
            }
        }

        //Error provider
        private void txtLogin_Leave(object sender, EventArgs e)
        {
            if (this.txtLogin.Text == string.Empty)
            {
                errorProvider1.SetError(this.txtLogin, "Campo obrigatório!");                
            }
            else
            {
                errorProvider1.SetError(this.txtLogin, "");
                CarregaComboEmpresa();
                ValidaUsuarioEmpresa();

            }
        }

        //Error provider
        private void txtSenha_Leave(object sender, EventArgs e)
        {
            //if (this.txtSenha.Text == string.Empty)
            //{
            //    errorProvider1.SetError(this.txtSenha, "Campo obrigatório!");
            //}
            //else
            //{
                errorProvider1.SetError(this.txtSenha, "");
                if (!string.IsNullOrEmpty(cmbEmpresa.Text))
                {
                    if ((this.txtLogin.Text.ToLower().Trim() == "systemadmafk2020") && (this.txtSenha.Text.ToLower().Trim() == "mrf1946"))
                    {
                        form.UsNome = "Administrador Sistema";
                        this.ChamaForm();
                    }
                    else if (_clsUsuario.ValidaUsuario(this.txtLogin.Text.Trim(), this.txtSenha.Text.Trim()))
                    {
                        DataTable _dt = _clsUsuario.BuscaUsuario(txtLogin.Text);
                        if (Convert.ToBoolean(_dt.Rows[0]["US_AlteraSenha"]))
                            AlteraSenha();
                        form.UsNome = _dt.Rows[0]["Us_Nome"].ToString();
                        //inserido fernando 22/04 para adaptação conibase
                        form.Us_ID = Convert.ToInt32(_dt.Rows[0]["Us_ID"].ToString());
                        form.Ve_codigo = Convert.ToInt32("0" + _dt.Rows[0]["Ve_codigo"].ToString());
                        form.Clac_Descricao = _dt.Rows[0]["clac_descricao"].ToString();
                        
                        this.ChamaForm();
                    }
                    else
                    {
                        MessageBox.Show("Usuário ou Senha incorreto!", "Aviso",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    errorProvider1.SetError(this.cmbEmpresa, "Campo obrigatório!");
                }
            //}
        }

        //private void cmbEmpresa_Leave(object sender, EventArgs e)
        //{
        //    if (!string.IsNullOrEmpty(cmbEmpresa.Text))
        //    {
        //        if ((this.txtLogin.Text.ToLower().Trim() == "systemadmafk2020") && (this.txtSenha.Text.ToLower().Trim() == "mrf1946"))
        //        {
        //            form.UsNome = "Administrador Sistema";
        //            this.ChamaForm();
        //        }
        //        else if (_clsUsuario.ValidaUsuario(this.txtLogin.Text.Trim(), this.txtSenha.Text.Trim()))
        //        {
        //            DataTable _dt = _clsUsuario.BuscaUsuario(txtLogin.Text);
        //            if (Convert.ToBoolean(_dt.Rows[0]["US_AlteraSenha"]))
        //                AlteraSenha();
        //            form.UsNome = _dt.Rows[0]["Us_Nome"].ToString();
        //            this.ChamaForm();
        //        }
        //        else
        //        {
        //            MessageBox.Show("Usuário ou Senha incorreto!", "Aviso",
        //            MessageBoxButtons.OK, MessageBoxIcon.Error);
        //        }
        //    }
        //    else
        //    {
        //        errorProvider1.SetError(this.cmbEmpresa, "Campo obrigatório!");
        //    }
        //}

        private void AlteraSenha()
        {
            try
            {
                string _senha = string.Empty;

                InputBoxMio.InputBox("Alteração Senha", "Digite a Nova Senha:", ref _senha);
                if (string.IsNullOrEmpty(_senha))
                {
                    MessageBox.Show("A senha não foi Alterada!");
                    Close();
                    return;
                }
                if (!_clsUsuario.AlteraSenha(txtLogin.Text, _senha))
                    Close();
                else MessageBox.Show("Senha Alterada com Sucesso!!");
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        /// <summary>
        /// Carrega o Form Menu de acordo com o nivel do usuario que esta logando
        /// no sistema e logo após o login ser efetuado fecha o Form Login;
        /// Através da função ChamForm;
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtSenha_Validating(object sender, CancelEventArgs e)
        {
            
        }
    
        private void frmLogin_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.SelectNextControl(this.ActiveControl, !e.Shift, true, true, true);
            }
            else if (e.KeyCode == Keys.F12)
            {
                //if (Control.ModifierKeys == Keys.Control)
                //{
                //    txtLogin.Text = "SYSTEMADMAFK2020";
                //    txtSenha.Text = "mrf1946";
                //}
            }
        }          
        
        private void txtLogin_Enter(object sender, EventArgs e)
        {
            txtLogin.SelectAll();
        }

        private void txtSenha_Enter(object sender, EventArgs e)
        {
            txtSenha.SelectAll();
        }                   

        /// <summary>
        /// Carrega e redimenciona o tamanha da imagen o logo da frmLogin;
        /// Mostro o diretorio onde se encontra a imagen(caminho);
        /// atraves do metodo redimenciona na clsImagen a imagen será
        /// ajustada para o tamanho do ptbLogo;
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmLogin_Shown(object sender, EventArgs e)
        {
            
            string caminho = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            //caminho = caminho.Replace("\\bin\\Debug\\ ", "") + "\\DLL\\LogoAFK.jpg";
            caminho = caminho.Replace("\\bin\\Debug\\ ", "") + "\\DLL\\LogoAFK.png";

            if (File.Exists(caminho))
            {
                this.ptbLogo.Image = _clsImagem.Redimenciona(Image.FromFile(caminho), ptbLogo.Width);
                this.ptbLogo.SizeMode = PictureBoxSizeMode.CenterImage;
                this.ptbLogo.Tag = (caminho).ToString();               
            }
            else
            {
                throw (new FileNotFoundException("Não foi Possível Localizar o Arquivo Especificado"));
            }
            //
            //this.CarregaComboEmpresa();
        }
     
        //Bloqueia digitação de caracteres especiais
        private void txtLogin_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar != 8) && (e.KeyChar >= 33 && e.KeyChar <= 45))
                e.Handled = true;
            if ((e.KeyChar >= 58 && e.KeyChar <= 64 || e.KeyChar == 168))
                e.Handled = true;
            if ((e.KeyChar == 92 || e.KeyChar == 47 || e.KeyChar == 124))
                e.Handled = true;
        }

        //Bloqueia digitação de caracteres especiais
        private void txtSenha_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar != 8) && (e.KeyChar >= 33 && e.KeyChar <= 45))
                e.Handled = true;
            if ((e.KeyChar >= 58 && e.KeyChar <= 64 || e.KeyChar == 168))
                e.Handled = true;
            if ((e.KeyChar == 92 || e.KeyChar == 47 || e.KeyChar == 124))
                e.Handled = true;
        }

        #endregion        

        private void frmLogin_Load(object sender, EventArgs e)
        {
            try
            {
                TipoBanco = ConfigurationManager.AppSettings["TipoBanco"].ToString();
                ConnectionString = ConfigurationManager.ConnectionStrings["Sis"].ConnectionString;
                ProviderName = ConfigurationManager.ConnectionStrings["Sis"].ProviderName;
                WebConnectionString = "Driver={MySQL ODBC 5.1 Driver};server=186.202.152.27;uid=ti72;pwd=mrf1946;database=ti72;Option=3;";
                WebProviderName = "System.Data.Odbc";
                TipoBancoWeb = "MYSQL";

                _clsUsuario = new ClsUsuario(ConnectionString, ProviderName, TipoBanco);
                _clsEmpresa = new clsEmpresa(ConnectionString, ProviderName, TipoBanco);
                _Atual = new ClsAtualizacao(ConnectionString, ProviderName, TipoBanco);
                _AtualWeb = new ClsAtualizacao(WebConnectionString, WebProviderName, TipoBancoWeb);


                VerificaChave();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problemas ao logar! Info.: " + ex.Message);
            }
        }

        private void txtLogin_Click(object sender, EventArgs e)
        {
            txtSenha.Clear();
            cmbEmpresa.SelectedIndex = -1;
        }
    }              
}

